home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
3006
/
3006.xpi
/
components
/
dhYTHQChecker.js
< prev
Wrap
Text File
|
2010-01-15
|
8KB
|
250 lines
/******************************************************************************
* Copyright (c) 2006-2009 Michel Gutierrez. All Rights Reserved.
******************************************************************************/
/**
* Constants.
*/
const NS_YTHQCHECKER_CID = Components.ID("{4d140074-831e-456d-bb58-1c29ab1924b4}");
const NS_YTHQCHECKER_PROG_ID = "@downloadhelper.net/ythq-checker;1";
const DHNS = "http://downloadhelper.net/1.0#";
var Util=null;
/**
* Object constructor
*/
function YTHQChecker() {
try {
//dump("[YTHQChecker] constructor\n");
this.listMgr=Components.classes["@downloadhelper.net/media-list-manager"]
.getService(Components.interfaces.dhIMediaListMgr);
var prefService=Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
this.pref=prefService.getBranch("dwhelper.");
this.updateFormats();
this.ios = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
this.formatIndex=0;
this.done=false;
} catch(e) {
dump("[YTHQChecker] !!! constructor: "+e+"\n");
}
}
YTHQChecker.prototype = {}
YTHQChecker.prototype.check=function(url,listener,args) {
//dump("[YTHQChecker] check("+url+")\n");
this.url=url;
this.listener=listener;
this.args=args;
this.checkNext();
}
function YTHQRequestObserver(client) {
this.client=client;
}
YTHQRequestObserver.prototype={
onStartRequest: function(request,context) {
},
onStopRequest: function(request,context) {
if(request.status==0) {
try {
//dump("Got format "+this.client.formats[this.client.formatIndex]+"\n");
var format=this.client.formats[this.client.formatIndex];
this.client.listener.checkedYTHQ(this.client.url+"&fmt="+format,this.client.args,format,this.client.getExtension(format));
} catch(e) {
dump("!!! [YTHQChecker] check callback failed: "+e+"\n");
}
} else {
this.client.formatIndex++;
this.client.checkNext();
}
}
}
YTHQChecker.prototype.checkNext = function() {
if(this.formatIndex<this.formats.length) {
var uri=this.ios.newURI(this.url+"&fmt="+this.formats[this.formatIndex],null,null);
this.listMgr.addCurrentURL(uri.spec);
this.checker=Components.classes['@mozilla.org/network/urichecker;1'].createInstance(Components.interfaces.nsIURIChecker);
this.checker.init(uri);
this.checker.loadFlags = Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE;
//dump("Testing format "+this.formats[this.formatIndex]+"\n");
this.checker.asyncCheck(new YTHQRequestObserver(this),this);
} else {
//dump("Give up checking hq\n");
try {
this.listener.checkedYTHQ(null,this.args,0,null);
} catch(e) {
dump("!!! [YTHQChecker] check callback failed: "+e+"\n");
}
}
}
function YTHQMultiRequestObserver(client,format) {
this.client=client;
this.format=format;
}
YTHQMultiRequestObserver.prototype={
onStartRequest: function(request,context) {
},
onStopRequest: function(request,context) {
if(request.status==0) {
try {
//dump("Multi Got format "+this.format+"\n");
this.client.listener.checkedYTHQ(this.client.url+"&fmt="+this.format,this.client.args,this.format,this.client.getExtension(this.format));
} catch(e) {
dump("!!! [YTHQChecker] check callback failed: "+e+"\n");
}
}
}
}
YTHQChecker.prototype.checkMulti=function(url,listener,args) {
//dump("[YTHQChecker] checkMulti("+url+")\n");
try {
this.url=url;
this.listener=listener;
this.args=args;
this.updateFormats();
for(var i in this.formats) {
var format=this.formats[i];
var uri=this.ios.newURI(this.url+"&fmt="+format,null,null);
this.listMgr.addCurrentURL(uri.spec);
this.checker=Components.classes['@mozilla.org/network/urichecker;1'].createInstance(Components.interfaces.nsIURIChecker);
this.checker.init(uri);
this.checker.loadFlags = Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE;
//dump("Multi Testing format "+format+"\n");
this.checker.asyncCheck(new YTHQMultiRequestObserver(this,format),this);
}
} catch(e) { dump(e); }
}
YTHQChecker.prototype.getExtension=function(format) {
if(format==13 || format==17)
return "3gp";
else if(format==18 || format==22 || format==37)
return "mp4";
else
return "flv";
}
YTHQChecker.prototype.updateFormats=function() {
var formats=this.pref.getCharPref("ythq-formats").split(",");
this.formats=[];
for(var i in formats) {
if(formats[i].length>0) {
this.formats.push(parseInt(formats[i]));
}
}
}
YTHQChecker.prototype.QueryInterface = function(iid) {
//dump("[YTHQChecker] QueryInterface("+iid+")\n");
if(
iid.equals(Components.interfaces.dhIYTHQChecker) ||
iid.equals(Components.interfaces.nsIStreamListener) ||
iid.equals(Components.interfaces.nsISupports)
) {
return this;
}
throw Components.results.NS_ERROR_NO_INTERFACE;
}
var vYTHQCheckerModule = {
firstTime: true,
/*
* RegisterSelf is called at registration time (component installation
* or the only-until-release startup autoregistration) and is responsible
* for notifying the component manager of all components implemented in
* this module. The fileSpec, location and type parameters are mostly
* opaque, and should be passed on to the registerComponent call
* unmolested.
*/
registerSelf: function (compMgr, fileSpec, location, type) {
if (this.firstTime) {
this.firstTime = false;
throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
}
compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
compMgr.registerFactoryLocation(NS_YTHQCHECKER_CID,
"YTHQChecker",
NS_YTHQCHECKER_PROG_ID,
fileSpec,
location,
type);
},
unregisterSelf: function(compMgr, fileSpec, location) {
compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
compMgr.unregisterFactoryLocation(NS_DH_YTHQCHECKER_CID, fileSpec);
},
/*
* The GetClassObject method is responsible for producing Factory and
* SingletonFactory objects (the latter are specialized for services).
*/
getClassObject: function (compMgr, cid, iid) {
if (!cid.equals(NS_YTHQCHECKER_CID)) {
throw Components.results.NS_ERROR_NO_INTERFACE;
}
if (!iid.equals(Components.interfaces.nsIFactory)) {
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
}
return this.vYTHQCheckerFactory;
},
/* factory object */
vYTHQCheckerFactory: {
/*
* Construct an instance of the interface specified by iid, possibly
* aggregating it with the provided outer. (If you don't know what
* aggregation is all about, you don't need to. It reduces even the
* mightiest of XPCOM warriors to snivelling cowards.)
*/
createInstance: function (outer, iid) {
if (outer != null) {
throw Components.results.NS_ERROR_NO_AGGREGATION;
}
if(Util==null)
Util=Components.classes["@downloadhelper.net/util-service;1"]
.getService(Components.interfaces.dhIUtilService);
return new YTHQChecker().QueryInterface(iid);
}
},
/*
* The canUnload method signals that the component is about to be unloaded.
* C++ components can return false to indicate that they don't wish to be
* unloaded, but the return value from JS components' canUnload is ignored:
* mark-and-sweep will keep everything around until it's no longer in use,
* making unconditional ``unload'' safe.
*
* You still need to provide a (likely useless) canUnload method, though:
* it's part of the nsIModule interface contract, and the JS loader _will_
* call it.
*/
canUnload: function(compMgr) {
return true;
}
};
function NSGetModule(compMgr, fileSpec) {
return vYTHQCheckerModule;
}